package com.wyzz.hr.bo.impl;

import com.wyzz.hr.bo.IEmpBenefitBo;
import com.wyzz.hr.bo.IEmpSalaryAcctBo;
import com.wyzz.hr.bo.IEmpSalaryAcctitemsBo;
import com.wyzz.hr.bo.IEmpSalaryAcctversionBo;
import com.wyzz.hr.bo.ISalaryPaidBo;
import com.wyzz.hr.bo.ISalaryconfBo;
import com.wyzz.hr.dao.IEmpSalaryAcctversionDao;
import com.wyzz.hr.pojo.Empsalaryacct;
import com.wyzz.hr.pojo.Empsalaryacctitems;
import com.wyzz.hr.pojo.Empsalaryacctversion;
import com.wyzz.hr.pojo.Empsalaryconfig;
import com.wyzz.hr.spring.SpringBeanFactory;
import com.wyzz.hr.util.DateUtil;
import com.wyzz.hr.util.Pager;

import java.util.*;
import org.hibernate.criterion.DetachedCriteria;

public class EmpSalaryAcctversionBoImpl implements IEmpSalaryAcctversionBo {

	public EmpSalaryAcctversionBoImpl() {
	}

	public Boolean deleteEmpsalaryacctversion(String esavId) {
		try {
			String hql = (new StringBuilder()).append(
					"delete Empsalaryacctversion as esav where id='").append(
					esavId).append("'").toString();
			empsalaryacctversionDao.exeHql(hql);
			return Boolean.valueOf(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Boolean.valueOf(false);
	}

	public List findEsav(DetachedCriteria dc, Pager page, String searchOrExport) {
		if (page == null || "export".equals(searchOrExport)) {
			return empsalaryacctversionDao.findByCriteria(dc);
		} else {
			page.splitPage(dc);
			return empsalaryacctversionDao.findByCriteria(dc, page
					.getPageSize(), page.getCurrentPage());
		}
	}

	public Boolean addAcctVersion(Empsalaryacctversion empsalaryacctversion,
			List newItems) {
		try {
			IEmpSalaryAcctBo esaBo = (IEmpSalaryAcctBo) SpringBeanFactory
					.getBean("empsalaryacctBo");
			esaBo.insertEmpsalaryacct(empsalaryacctversion.getEsavEsac());
			insertEmpsalaryacctversion(empsalaryacctversion);
			IEmpSalaryAcctitemsBo esaiBo = (IEmpSalaryAcctitemsBo) SpringBeanFactory
					.getBean("empsalaryacctitemsBo");
			esaiBo.saveOrupdate(newItems);
			return Boolean.valueOf(true);
		} catch (Exception e) {
			return Boolean.valueOf(false);
		}
	}

	public Boolean deleteAcctVersion(String acctversionId, String acctId) {
		IEmpSalaryAcctBo esaBo;
		IEmpSalaryAcctitemsBo esaiBo;
		ISalaryconfBo escBo;
		try {
			esaBo = (IEmpSalaryAcctBo) SpringBeanFactory
					.getBean("empsalaryacctBo");
			Empsalaryacctversion esavPrev = esaBo.getMaxValidToEsav(acctId);
			esaiBo = (IEmpSalaryAcctitemsBo) SpringBeanFactory
					.getBean("empsalaryacctitemsBo");
			if (!esavPrev.getId().equals(acctversionId)) {
				ISalaryconfBo salaryconfBo = (ISalaryconfBo) SpringBeanFactory
						.getBean("salaryconfBo");
				if (salaryconfBo.hasSalaryConfigByAcctVersion(acctversionId) > 0) {
					Map newMap = getOldAcctItems(acctversionId);
					List oldItems = esaiBo.getItemsByAcctversion(esavPrev
							.getId());
					List salaryconfigList = salaryconfBo.changeSalaryConfig(
							acctversionId, newMap, oldItems);
					salaryconfBo.saveOrupdate(salaryconfigList);
				}
				esavPrev.setEsavValidTo(null);
				updateEmpsalaryacctversion(esavPrev);
				esaiBo.deleteEmpsalaryacctitems(acctversionId);
				deleteEmpsalaryacctversion(acctversionId);
				return Boolean.valueOf(true);
			}
		} catch (Exception e) {
			return Boolean.valueOf(false);
		}
		escBo = (ISalaryconfBo) SpringBeanFactory.getBean("salaryconfBo");
		escBo.deleteSalaryConfig(acctversionId);
		esaiBo.deleteEmpsalaryacctitems(acctversionId);
		deleteEmpsalaryacctversion(acctversionId);
		esaBo.deleteEmpsalaryacct(acctId);
		return Boolean.valueOf(true);
	}

	public Boolean updateAcctVersion(Empsalaryacctversion empsalaryacctversion,
			List newItems, List salaryconfigList, List salarypayList,
			List planList) {
		try {
			IEmpSalaryAcctBo esaBo = (IEmpSalaryAcctBo) SpringBeanFactory
					.getBean("empsalaryacctBo");
			esaBo.updateEmpsalaryacct(empsalaryacctversion.getEsavEsac());
			empsalaryacctversion.setEsavLastChangeTime(new Date());
			IEmpSalaryAcctversionBo esavBo = (IEmpSalaryAcctversionBo) SpringBeanFactory
					.getBean("empsalaryacctversionBo");
			esavBo.updateEmpsalaryacctversion(empsalaryacctversion);
			ISalaryconfBo salaryconfBo = (ISalaryconfBo) SpringBeanFactory
					.getBean("salaryconfBo");
			salaryconfBo.saveOrupdate(salaryconfigList);
			ISalaryPaidBo espBo = (ISalaryPaidBo) SpringBeanFactory
					.getBean("salaryPaidBo");
			espBo.saveOrupdate(salarypayList);
			IEmpBenefitBo empbenefitBo = (IEmpBenefitBo) SpringBeanFactory
					.getBean("empbenefitBo");
			empbenefitBo.saveOrupdate(planList);
			IEmpSalaryAcctitemsBo esaiBo = (IEmpSalaryAcctitemsBo) SpringBeanFactory
					.getBean("empsalaryacctitemsBo");
			esaiBo.deleteEmpsalaryacctitems(empsalaryacctversion.getId());
			esaiBo.saveOrupdate(newItems);
			return Boolean.valueOf(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Boolean.valueOf(false);
	}

	public Boolean updateAcctVersion(Empsalaryacctversion empsalaryacctversion,
			List newItems, List salaryconfigList) {
		try {
			IEmpSalaryAcctBo esaBo = (IEmpSalaryAcctBo) SpringBeanFactory
					.getBean("empsalaryacctBo");
			esaBo.updateEmpsalaryacct(empsalaryacctversion.getEsavEsac());
			empsalaryacctversion.setEsavLastChangeTime(new Date());
			Date today = DateUtil.convDateTimeToDate(new Date());
			empsalaryacctversion.setEsavValidTo(DateUtil.dateAdd(today, -1));
			IEmpSalaryAcctversionBo esavBo = (IEmpSalaryAcctversionBo) SpringBeanFactory
					.getBean("empsalaryacctversionBo");
			esavBo.updateEmpsalaryacctversion(empsalaryacctversion);
			String curempId = empsalaryacctversion.getEsavLastChangeBy();
			Empsalaryacct empsalaryacct = empsalaryacctversion.getEsavEsac();
			empsalaryacctversion = new Empsalaryacctversion();
			empsalaryacctversion.setEsavEsac(empsalaryacct);
			empsalaryacctversion.setEsavCreateBy(curempId);
			empsalaryacctversion.setEsavCreateTime(new Date());
			empsalaryacctversion.setEsavLastChangeBy(curempId);
			empsalaryacctversion.setEsavLastChangeTime(new Date());
			empsalaryacctversion.setEsavValidFrom(today);
			empsalaryacctversion.setEsavValidTo(null);
			esavBo.insertEmpsalaryacctversion(empsalaryacctversion);
			Empsalaryconfig cfg;
			for (Iterator i$ = salaryconfigList.iterator(); i$.hasNext(); cfg
					.setEscEsavId(empsalaryacctversion))
				cfg = (Empsalaryconfig) i$.next();

			ISalaryconfBo salaryconfBo = (ISalaryconfBo) SpringBeanFactory
					.getBean("salaryconfBo");
			salaryconfBo.saveOrupdate(salaryconfigList);
			Empsalaryacctitems nitms;
			for (Iterator i$ = newItems.iterator(); i$.hasNext(); nitms
					.setEsaiEsav(empsalaryacctversion))
				nitms = (Empsalaryacctitems) i$.next();

			IEmpSalaryAcctitemsBo esaiBo = (IEmpSalaryAcctitemsBo) SpringBeanFactory
					.getBean("empsalaryacctitemsBo");
			esaiBo.saveOrupdate(newItems);
			return Boolean.valueOf(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return Boolean.valueOf(false);
	}

	public Map getOldAcctItems(String esavId) {
		IEmpSalaryAcctitemsBo esaiBo = (IEmpSalaryAcctitemsBo) SpringBeanFactory
				.getBean("empsalaryacctitemsBo");
		List oldItems = esaiBo.getItemsByAcctversion(esavId);
		Map oldMap = new HashMap();
		String dataDefId = new String();
		for (int i = 0; i < oldItems.size(); i++) {
			dataDefId = ((Empsalaryacctitems) oldItems.get(i)).getEsaiEsdd()
					.getEsddId();
			oldMap.put(dataDefId, Integer.valueOf(i));
		}

		return oldMap;
	}

	public List getObjects(Class clas, String fetch[]) {
		return empsalaryacctversionDao.getObjects(Empsalaryacctversion.class,
				fetch);
	}

	public Boolean insertEmpsalaryacctversion(
			Empsalaryacctversion empsalaryacctversion) {
		empsalaryacctversionDao.saveObject(empsalaryacctversion);
		return Boolean.valueOf(true);
	}

	public Empsalaryacctversion loadObject(String esavId, String fetch[]) {
		return (Empsalaryacctversion) empsalaryacctversionDao.loadObject(
				Empsalaryacctversion.class, esavId, fetch, null);
	}

	public Boolean updateEmpsalaryacctversion(
			Empsalaryacctversion empsalaryacctversion) {
		empsalaryacctversionDao.updateObject(empsalaryacctversion);
		return Boolean.valueOf(true);
	}

	public IEmpSalaryAcctversionDao getEmpsalaryacctversionDao() {
		return empsalaryacctversionDao;
	}

	public void setEmpsalaryacctversionDao(
			IEmpSalaryAcctversionDao empsalaryacctversionDao) {
		this.empsalaryacctversionDao = empsalaryacctversionDao;
	}

	private IEmpSalaryAcctversionDao empsalaryacctversionDao;
}
